package com.xscha.tableforge.controller;

import com.xscha.soyue.common.core.domain.R;
import com.xscha.tableforge.model.dto.LoginDto;
import com.xscha.tableforge.model.dto.RefreshTokenDto;
import com.xscha.tableforge.model.vo.TokenVo;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;

/**
 * 认证控制器
 */
@RestController
@RequestMapping("/api/auth")
public class AuthController {

    /**
     * 用户登录
     *
     * @param loginDto 登录信息
     * @return 登录结果
     */
    @PostMapping("/login")
    public R<TokenVo> login(@RequestBody LoginDto loginDto) {
        // 模拟登录过程，实际应用中应该验证用户名和密码
        if (loginDto.getUsername() != null && loginDto.getPassword() != null) {
            TokenVo tokenVo = new TokenVo();
            tokenVo.setAccessToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiJ9");
            tokenVo.setRefreshToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsInR5cGUiOiJyZWZyZXNoIn0");
            tokenVo.setExpires(7200L);
            return R.ok(tokenVo);
        }
        return R.fail("用户名或密码错误");
    }

    /**
     * 刷新令牌
     *
     * @param refreshTokenDto 刷新令牌请求
     * @return 新的令牌
     */
    @PostMapping("/refresh")
    public R<TokenVo> refreshToken(@RequestBody RefreshTokenDto refreshTokenDto) {
        // 模拟刷新令牌过程，实际应用中应该验证刷新令牌的有效性
        if (refreshTokenDto.getRefreshToken() != null && !refreshTokenDto.getRefreshToken().isEmpty()) {
            TokenVo tokenVo = new TokenVo();
            tokenVo.setAccessToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiJ9.new");
            tokenVo.setRefreshToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxIiwidXNlcm5hbWUiOiJhZG1pbiIsInR5cGUiOiJyZWZyZXNoIn0.new");
            tokenVo.setExpires(7200L);
            return R.ok(tokenVo);
        }
        return R.fail("刷新令牌无效");
    }

    /**
     * 用户登出
     *
     * @return 登出结果
     */
    @PostMapping("/logout")
    public R<Void> logout() {
        // 模拟登出过程，实际应用中应该使令牌失效
        return R.ok();
    }

    /**
     * 获取访问权限代码
     *
     * @return 权限代码列表
     */
    @GetMapping("/codes")
    public R<List<String>> getAccessCodes() {
        // 模拟获取权限代码，实际应用中应该根据用户角色返回相应的权限代码
        List<String> codes = Arrays.asList(
            "*",
            "dashboard.workplace",
            "dashboard.analysis",
            "tableforge",
            "tableforge.app",
            "tableforge.table",
            "tableforge.field",
            "tableforge.view"
        );
        return R.ok(codes);
    }
}